package com.jic.interaction.JDVOP.mapper;

import com.jic.interaction.JDVOP.model.entity.JDProduct;
import com.jic.interaction.JDVOP.model.entity.Product;
import com.jic.product.after.request.GoodsPageQueryRequest;
import com.jic.product.after.request.ProductSaleNumRequest;
import com.jic.product.after.request.SaveProductRequest;
import com.jic.product.after.response.*;
import com.jic.product.manage.request.BatchProductRequest;
import com.jic.product.manage.request.ProductRequest;
import com.jic.product.manage.request.ShopInfoRequest;
import com.jic.product.manage.response.*;
import com.jic.product.rest.request.ProductRestRequest;
import com.jic.product.rest.response.ProductInfoResponse;
import com.jic.product.rest.response.ProductPropertyResponseFront;
import com.jic.product.rest.response.ProductPropertyValueResponse;
import com.jic.product.rest.response.ProductResponseFront;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 商品表
 *
 * @author :
 * @version : v1.0.0
 * @email :
 * @since : 2020-01-10 07:03:01
 */
@Mapper
public interface ProductMapper {

    /**
     * 插入
     *
     * @param product 产品
     * @return long
     */
    long insert(JDProduct product);

    /**
     * 删除
     *
     * @param id id
     * @return long
     */
    long delete(Long id);

    /**
     * 更新
     *
     * @param product 产品
     * @return long
     */
    long update(JDProduct product);

    /**
     * 更新商店cansale
     *
     * @param product 产品
     * @return long
     */
    long updateShopCansale(JDProduct product);

    /**
     * 通过主键查询
     *
     * @param id id
     * @return {@link JDProduct}
     */
    JDProduct queryByPrimaryKey(Long id);

    /**
     * 查询
     *
     * @param product 产品
     * @return {@link List<JDProduct>}
     */
    List<JDProduct> query(JDProduct product);

    List<JDProduct> queryProductInfoByParentId(JDProduct product);

    /**
     * 查询产品目录
     * 进目录商品查询
     *
     * @param product 产品
     * @return {@link List<ProductResponse>}
     */
    List<ProductResponse> queryProductCatalog(@Param("product") JDProduct product);

    /**
     * 查询页面
     *
     * @param startIndex 开始指数
     * @param limit      限制
     * @param product    产品
     * @return {@link List<ProductResponse>}
     */
    List<ProductResponse> queryPage(@Param("startIndex") int startIndex, @Param("limit") int limit, @Param("product") JDProduct product);


    /**
     * 查询页面数
     *
     * @param product 产品
     * @return long
     */
    long queryPageCount(@Param("product") JDProduct product);

    /**
     * 查询商店页面
     *
     * @param startIndex 开始指数
     * @param limit      限制
     * @param shop       商店
     * @return {@link List<ShopInfoResponse>}
     */
    List<ShopInfoResponse> queryShopPage(@Param("startIndex") int startIndex, @Param("limit") int limit, @Param("shop") ShopInfoRequest shop);

    /**
     * 查询店数
     *
     * @param shop 商店
     * @return long
     */
    long queryShopCount(@Param("shop") ShopInfoRequest shop);

    /**
     * 查询商店产品页面
     *
     * @param startIndex 开始指数
     * @param limit      限制
     * @param shop       商店
     * @return {@link List<ShopProductInfoResponse>}
     */
    List<ShopProductInfoResponse> queryShopProductPage(@Param("startIndex") int startIndex, @Param("limit") int limit, @Param("shop") ShopInfoRequest shop);

    /**
     * 查询商店产品页面数
     *
     * @param shop 商店
     * @return long
     */
    long queryShopProductPageCount(@Param("shop") ShopInfoRequest shop);

    /**
     * 查询产品id
     *
     * @param id id
     * @return {@link ProductInfoResponse}
     */
    ProductInfoResponse queryByProductId(@Param("id") long id);

    /**
     * 查询推荐产品
     * @param
     * @return {@link List<ProductResponseFront>}
     */
    List<ProductResponseFront> queryRecommendedProducts();

    /**
   通过id获取产品信息
     *
     * @param id id
     * @return {@link ProductResponseFront}
     */
    ProductResponseFront getProductInfoById(long id);

    /**
     * 查询id属性名
     *
     * @param id id
     * @return {@link List<ProductPropertyResponseFront>}
     */
    List<ProductPropertyResponseFront> queryPropertyNameByIds(Long[] id);

    /**
     * 查询属性值由ids
     *
     * @param id id
     * @return {@link List<ProductPropertyValueResponse>}
     */
    List<ProductPropertyValueResponse> queryPropertyValueByIds(Long[] id);

    /**
     * 查询产品id
     *
     * @param id id
     * @return {@link ProductAfterInfoResponse}
     */
    ProductAfterInfoResponse queryByAfterProductId(@Param("id") long id);

    /**
     * 查询产品信息通过id
     *
     * @param id id
     * @return {@link ProductAfterInfoByIdResponse}
     */
    ProductAfterInfoByIdResponse queryProductInfoById(@Param("id") long id);

    /**
     * 查询产品信息根据三方编码
     *
     * @param thirdProductCode
     * @return
     */
    ProductAfterInfoByIdResponse queryProductInfoBythirdProductCode(@Param("thirdProductCode") String thirdProductCode);

    /**
     * 查询业务信息产品id
     *
     * @param id id
     * @return {@link ShoppingCartResponse}
     */
    ShoppingCartResponse queryBusinessInfoByProductId(@Param("id") long id);

    /**
     * 查询的id属性名
     *
     * @param id id
     * @return {@link List<ProductPropertyResponseFront>}
     */
    List<ProductPropertyResponseFront> queryPropertyNameById(Long id);

    /**
     * 查询的id属性值
     *
     * @param id id
     * @return {@link List<ProductPropertyValueResponse>}
     */
    List<ProductPropertyValueResponse> queryPropertyValueById(Long id);

    /**
     * 查询产品部门id列表
     *
     * @param productInfoRequest 产品信息请求
     * @return {@link List<JDProduct>}
     */
    List<JDProduct> queryProductDeptIdList(SaveProductRequest productInfoRequest);

    /**
     * 查询产品的商人id列表
     *
     * @param productInfoRequest 产品信息请求
     * @return {@link List<JDProduct>}
     */
    List<JDProduct> queryProductMerchantIdList(SaveProductRequest productInfoRequest);

    /**
     * 被父id产品列表
     *
     * @param product 产品
     * @return {@link List<ProductParentResponse>}
     */
    List<ProductParentResponse> getProductListByParentId(JDProduct product);

    /**
     * 由父id查询产品
     *
     * @param product 产品
     * @return {@link List<JDProduct>}
     */
    List<JDProduct> queryProductByParentId(JDProduct product);

    /**
     * 删除产品父
     *
     * @param id id
     * @return long
     */
    long deleteProductParent(Long id);

    /**
     * 查询通过裁判id
     *
     * @param product 产品
     * @return {@link JDProduct}
     */
    JDProduct queryByRefId(JDProduct product);

    /**
     * 查询产品信息
     *
     * @param id id
     * @return {@link ProductResponse}
     */
    ProductResponse queryProductInfo(Long id);

    /**
     * 更新产品信息
     *
     * @param product 产品
     */
    void updateProductInfo(JDProduct product);

    /**
     * 查询产品通过刺激id列表
     *
     * @param id id
     * @return {@link ProductAfterResponse}
     */
    ProductAfterResponse queryProductListByProdId(long id);

    /**
     * 查询产品存储id
     *
     * @param storeId 存储id
     * @return long
     */
    long queryProductByStoreId(Long storeId);

    /**
     * 查询产品的id列表
     *
     * @param productIds 产品id
     * @return {@link List<ProductResponseFront>}
     */
    List<ProductResponseFront> queryProductListById(List<Long> productIds);

    /**
     * 查询产品分配id
     * 商家商品管理 渠道分发列表查询
     *
     * @param productId 产品id
     * @return {@link List<ProductDistributeResponse>}
     * @author: JackHe
     * @date: 2020/4/9 14:14
     */
    List<ProductDistributeResponse> queryProductDistributeById(Long productId);


    /**
     * 查询商店产品列表
     * 查询店铺商品
     *
     * @param shop 商店
     * @return {@link List<ShopInfoResponse>}
     * @author: JackHe
     * @date: 2020/4/9 14:14
     */
    List<ShopInfoResponse> queryShopProductList(@Param("shop") ShopInfoRequest shop);

    /**
     * 产品按类别id
     * description: 查询每个类目ID的商品信息
     *
     * @param categoryIdList 类别id列表
     * @param productRequest 产品要求
     * @return {@link List<ProductResponse>}
     * @author: jackHe
     * @time: 2020/4/28 17:41
     */
    List<ProductResponse> productByCategoryId(@Param("categoryIdList") List<JDProduct> categoryIdList, @Param("product") ProductRequest productRequest);

    /**
     * 产品按类别id数
     *
     * @param categoryIdList 类别id列表
     * @param productRequest 产品要求
     * @return long
     */
    long productByCategoryIdCount(@Param("categoryIdList") List<JDProduct> categoryIdList, @Param("product") ProductRequest productRequest);

    /**
     * 按类别id查询
     * description: 根据多个类目ID查询商品ID
     *
     * @param batchProductRequest 批产品要求
     * @return {@link List<Long>}
     * @author: jackHe
     * @time: 2020/4/29 13:57
     */
    List<Long> queryByCategoryId(@Param("product") BatchProductRequest batchProductRequest);

    /**
     * 查询商店产品页面
     *
     * @param startIndex 开始指数
     * @param limit      限制
     * @param shop       商店
     * @return {@link List<JDProduct>}
     */
    List<JDProduct> queryProductSkuPage(@Param("startIndex") int startIndex, @Param("limit") int limit, @Param("shop") ShopInfoRequest shop);

    /**
     * 查询商店产品页面数
     *
     * @param shop 商店
     * @return long
     */
    long queryProductSkuPageCount(ShopInfoRequest shop);

    List<JDProduct> queryAll(JDProduct product);


    /**
     * 根据店铺id查询店铺商品
     *
     * @return {@link List<ShopInfoResponse>}
     * @author: JackHe
     * @date: 2020/4/9 14:14
     */
    List<ShopInfoResponse> queryPorductByStoreId(@Param("startIndex") int startIndex, @Param("limit") int limit, @Param("deptId") long deptId);

    long queryPageCountByStoreId(@Param("deptId") long deptId);


    /**
     * 根据后台类目ids查询商品
     *
     * @param productRestRequest
     * @return {@link List<ShopInfoResponse>}
     * @author: JackHe
     * @date: 2020/4/9 14:14
     */
    List<ProductResponseFront> queryRestPorduct(@Param("productRestRequest") ProductRestRequest productRestRequest, @Param("startIndex") int startIndex, @Param("limit") int limit);

    /**
     * 根据后台类目ids查询商品
     *
     * @param productRestRequest
     * @return {@link List<ShopInfoResponse>}
     * @author: JackHe
     * @date: 2020/4/9 14:14
     */
   Long queryRestPorductCount(@Param("productRestRequest") ProductRestRequest productRestRequest);

    /**
     * 根据产品ids查询商品
     *
     * @param productIds
     * @return {@link List<ShopInfoResponse>}
     * @author: JackHe
     * @date: 2020/4/9 14:14
     */
    List<ProductResponseFront> queryProductInfoByProductIds(List<Long> productIds);


    /**
     * 查询产品存储id
     *
     * @param product 存储id
     * @return long
     */
    List<ProductStoreInfo> queryProductByStoreIds(JDProduct product);

    /**
     * 查询产品存储id
     *
     * @param product 存储id
     * @return long
     */
    List<ProductStoreInfo> queryProductBySpuId(JDProduct product);

    /**
     * 查询产品存储id
     *
     * @param goodsPageQueryRequest 存储id
     * @return long
     */
    List<ProductStoreInfo> queryProductBySpuList(GoodsPageQueryRequest goodsPageQueryRequest);

    /**
     * 查询产品存储id
     *
     * @param goodsPageQueryRequest 存储id
     * @return long
     */
    List<Long> queryProductByCode(GoodsPageQueryRequest goodsPageQueryRequest);

    List<ProductStoreInfo> queryProductBySpuIds(@Param("spuIds") List<Long> spuIds, @Param("canSale") Integer canSale);

    List<ProductStoreInfo> queryProductListByThirdProductCodes(@Param("codeList") String codeList);

    /**
     * 查询产品存储id
     *
     * @param goodsPageQueryRequest 存储id
     * @return long
     */
    List<ProductStoreInfo> queryProductPageByStoreIds(@Param("goodsPageQueryRequest") GoodsPageQueryRequest goodsPageQueryRequest, @Param("startIndex") int startIndex, @Param("limit") int limit);

    /**
     * 查询产品存储id
     *
     * @param goodsPageQueryRequest 存储id
     * @return long
     */
    Long queryProductPageByStoreIdsCount(GoodsPageQueryRequest goodsPageQueryRequest);

    /**
     * 前端历史搜索模糊匹配商品名称
     *
     * @param product
     */
    List<JDProduct> queryMProductSearchHistoryList(JDProduct product);


    /**
     * 更新商品销售数量
     *
     * @param
     * @return long
     */
    Long updateProductSaleNum(ProductSaleNumRequest productSaleNumRequest);

    void toinsert(Product product);
}
